home *** CD-ROM | disk | FTP | other *** search
/ Gigantic Games 2 / Gigantic Games 2.iso / pc / _a_ / abitur / txt / fragen.mod < prev    next >
Text File  |  1994-12-23  |  7KB  |  251 lines

  1. IMPLEMENTATION MODULE Fragen;
  2.  
  3. FROM FaecherNamen IMPORT FaecherNamen, FaecherTypen;
  4. FROM LineReader IMPORT ReadALine;
  5. FROM SYSTEM IMPORT ADR;
  6. FROM Exec IMPORT AllocMem, FreeMem, MemReqs, MemReqSet;
  7. FROM Arts IMPORT BreakPoint, Assert, TermProcedure;
  8. FROM Dos IMPORT Open, Close, oldFile, FileHandlePtr;
  9. FROM Str IMPORT Copy, Concat, Length;
  10. FROM Strings IMPORT Compare;
  11. FROM RandomNumber IMPORT RND;
  12.  
  13.  
  14. PROCEDURE ScanAnAntEle(VAR Str: ARRAY OF CHAR; VAR Pos:INTEGER): FAntwortPtr;
  15. VAR TempAntEle: FAntwortPtr;
  16.     IPos : INTEGER;
  17. BEGIN
  18.    WHILE (Str[Pos] # "(") AND (Str[Pos] # '"') DO
  19.       IF Str[Pos] = 0C THEN
  20.          RETURN NIL
  21.       END;
  22.       INC(Pos)
  23.    END;
  24.    TempAntEle := AllocMem(SIZE(FAntwort), MemReqSet{public});
  25.    Assert(TempAntEle#NIL, ADR("Not enough mem"));
  26.    IF Str[Pos] = '"' THEN
  27.       TempAntEle^.IsText := TRUE;
  28.       INC(Pos); IPos := 0;
  29.       WHILE (Str[Pos] # '"') AND (Str[Pos] # 0C) DO
  30.          TempAntEle^.Str[IPos] := Str[Pos];
  31.          INC(Pos); INC(IPos)
  32.       END;
  33.       TempAntEle^.Str[IPos] := 0C;
  34.       IF Str[Pos] = '"' THEN INC(Pos) END
  35.    ELSIF Str[Pos] = "(" THEN
  36.       TempAntEle^.IsText := FALSE;
  37.       TempAntEle^.Mul := {};
  38.       INC(Pos);
  39.       WHILE (Str[Pos] # ")") AND (Str[Pos] # 0C) DO
  40.          CASE CAP(Str[Pos]) OF
  41.           "A": INCL(TempAntEle^.Mul, 0)
  42.          |"B": INCL(TempAntEle^.Mul, 1)
  43.          |"C": INCL(TempAntEle^.Mul, 2)
  44.          |"D": INCL(TempAntEle^.Mul, 3)
  45.          |"E": INCL(TempAntEle^.Mul, 4)
  46.          |"F": INCL(TempAntEle^.Mul, 5)
  47.          ELSE
  48.          END;
  49.          INC(Pos)
  50.       END
  51.    END;
  52.    RETURN TempAntEle
  53. END ScanAnAntEle;
  54.  
  55.  
  56.  
  57.  
  58. PROCEDURE GetOneFrage(F: FileHandlePtr): FragePtr;
  59. VAR AFrage: FragePtr;
  60.     TempString: ARRAY[0..511] OF CHAR;
  61.     EOFile: BOOLEAN;
  62.     Zeile: INTEGER;
  63.     i: INTEGER;
  64.     pos: INTEGER;
  65.     Nummer: INTEGER;
  66.     ScanPos: INTEGER;
  67.     AntEle: FAntwortPtr;
  68. BEGIN
  69.    AFrage := AllocMem(SIZE(Frage), MemReqSet{public});
  70.    Assert(AFrage#NIL, ADR("Nicht genug Speicher"));
  71.    AFrage^.Next := NIL;
  72.    FOR i := 0 TO 10 DO AFrage^.Txt[i][0] := 0C END;
  73.    FOR i := 1 TO  6 DO AFrage^.MultipleAntw[i][0] := 0C END;
  74.    FOR i := 1 TO  6 DO AFrage^.Auswert[i] := NIL END;
  75.    Zeile := 0; (* Nächste StringZeile in AFrage.Txt hier *)
  76.  
  77.    REPEAT
  78.       ReadALine(F, TempString, EOFile);
  79.       IF (TempString[0] = '"') THEN
  80.          pos := 0;
  81.          REPEAT
  82.             INC(pos);
  83.             AFrage^.Txt[Zeile][pos-1] := TempString[pos]
  84.          UNTIL TempString[pos] = 0C;
  85.          INC(Zeile)
  86.       END
  87.    UNTIL EOFile OR (TempString[0] # '"');
  88.      (* Die Gelesene Zeile bleibt in TempString *)
  89.  
  90.    IF Zeile = 0 THEN  (* Keine Frage gelesen: *)
  91.       FreeMem(AFrage, SIZE(Frage));
  92.       RETURN NIL
  93.    END;
  94.  
  95.    REPEAT (* Habe bereits eine Zeile gelesen *)
  96.       IF NOT EOFile AND (TempString[0] # "1") THEN
  97.          TempString[0] := CAP(TempString[0]);
  98.         (* Multiple Antwort Lesen *)
  99.          IF (TempString[0] >= "A") AND (TempString[0] <= "F") THEN
  100.             Nummer := ORD(TempString[0]) - ORD("A") + 1;
  101.             IF TempString[1] = " " THEN
  102.                ScanPos := 2
  103.             ELSE
  104.                ScanPos := 1
  105.             END;
  106.             pos := 0; (* Wohin sollen die Zeichen *)
  107.             REPEAT
  108.                AFrage^.MultipleAntw[Nummer][pos] := TempString[ScanPos];
  109.                INC(pos); INC(ScanPos)
  110.             UNTIL TempString[ScanPos-1] = 0C
  111.          END; (* Multiple Eintrag *)
  112.  
  113.         (* Notengebung Auswertung einscannen *)
  114.          IF (TempString[0] >= "1") AND (TempString[0] <= "6") THEN
  115.             Nummer := ORD(TempString[0]) - ORD("1") + 1;
  116.             ScanPos := 1;
  117.             AFrage^.Auswert[Nummer] := NIL;
  118.             REPEAT
  119.                AntEle := ScanAnAntEle(TempString, ScanPos);
  120.                IF AntEle # NIL THEN
  121.                   AntEle^.Next := AFrage^.Auswert[Nummer];
  122.                   AFrage^.Auswert[Nummer] := AntEle
  123.                END
  124.             UNTIL AntEle = NIL;
  125.          END
  126.       END;
  127.       ReadALine(F, TempString, EOFile);
  128.    UNTIL EOFile OR (TempString[0] = "1") ;
  129.  
  130.    RETURN AFrage
  131. END GetOneFrage;
  132.  
  133.  
  134. PROCEDURE GetDskFrage(F: FaecherTypen);
  135. VAR AktFrage: FragePtr;
  136.     FFile: FileHandlePtr;
  137.     FName: ARRAY[0..255] OF CHAR;
  138. BEGIN
  139.    Copy(FName, "Fragen/");
  140.    Concat(FName, FaecherNamen[F].VollName);
  141.    FFile := Open(ADR(FName), oldFile);
  142.    AnzaFragen[F] := 0;
  143.    AlleFragen[F] := NIL;
  144.    IF FFile # NIL THEN
  145.       REPEAT
  146.          AktFrage := GetOneFrage(FFile);
  147.          IF AktFrage # NIL THEN
  148.             INC(AnzaFragen[F]);
  149.             AktFrage^.Next := AlleFragen[F];
  150.             AlleFragen[F] := AktFrage
  151.          END
  152.       UNTIL AktFrage = NIL;
  153.       Close(FFile)
  154.    END
  155. END GetDskFrage;
  156.  
  157.  
  158. PROCEDURE Bewerte(F: FragePtr; VAR S: SchuelerAntwort): REAL;
  159.  (* Gibt von Frage F und SchuelerAntwort S die Note zurück *)
  160.  (* Note von 1.0 2.0 3.0 .. 6.0 *)
  161. VAR Note : REAL;
  162.     i: INTEGER;
  163.     Aptr : FAntwortPtr;
  164. BEGIN
  165.    Note := 6.0;
  166.    i := 6;
  167.    LOOP
  168.       Aptr := F^.Auswert[i];
  169.       WHILE Aptr # NIL DO
  170.          (* BreakPoint(ADR("InFragenBewert")); *)
  171.          IF Aptr^.IsText THEN
  172.             IF Compare(S.Str, 0, Length(S.Str), Aptr^.Str, FALSE) = 0 THEN
  173.                RETURN Note
  174.             END
  175.          ELSE (* Ist multiple Antwort *)
  176.             IF S.Mul = Aptr^.Mul THEN
  177.                RETURN Note
  178.             END
  179.          END;
  180.          Aptr := Aptr^.Next
  181.       END;
  182.       Note := Note - 1.0;
  183.       DEC(i);
  184.       IF i = 1 THEN RETURN 1.0 END
  185.    END
  186. END Bewerte;
  187.  
  188.  
  189.  
  190. PROCEDURE SearchRNDFrage(Fach: FaecherTypen): FragePtr;
  191. (* Sucht in der Liste Allefragen nach dem Fach und eine Beliebige Frage.
  192.  * gibt NIL zurück, wenn keine Frage vorhanden ist.
  193.  *)
  194. VAR F: FragePtr;
  195.     Nummer, i: INTEGER;
  196. BEGIN
  197.    IF AnzaFragen[Fach] <= 0 THEN RETURN NIL END;
  198.    Nummer := RND(AnzaFragen[Fach]); (* 0..Anzahl-1 *)
  199.    F := AlleFragen[Fach];
  200.    IF Nummer > 0 THEN
  201.       FOR i := 1 TO Nummer DO
  202.          F := F^.Next
  203.       END
  204.    END;
  205.    RETURN F
  206. END SearchRNDFrage;
  207.  
  208.  
  209.  
  210.  
  211. PROCEDURE FreeFants(F: FAntwortPtr);
  212. VAR Temp: FAntwortPtr;
  213. BEGIN
  214.    WHILE F # NIL DO
  215.       Temp := F;
  216.       F := F^.Next;
  217.       FreeMem(Temp, SIZE(FAntwort))
  218.    END
  219. END FreeFants;
  220.  
  221.  
  222.  
  223. PROCEDURE FreeAllFragen;
  224. VAR F: FaecherTypen;
  225.     Tmp: FragePtr;
  226.     i: INTEGER;
  227. BEGIN
  228.    FOR F := Turnen TO Informatik DO
  229.       WHILE AlleFragen[F] # NIL DO
  230.          FOR i := 1 TO 6 DO
  231.             FreeFants(AlleFragen[F]^.Auswert[i])
  232.          END;
  233.          Tmp := AlleFragen[F];
  234.          AlleFragen[F] := AlleFragen[F]^.Next;
  235.          FreeMem(Tmp, SIZE(Frage))
  236.       END
  237.    END;
  238.    (* BreakPoint(ADR("Free alle Fragen")); *)
  239. END FreeAllFragen;
  240.  
  241.  
  242.  
  243. VAR Fach: FaecherTypen;
  244. BEGIN
  245.    FOR Fach := Turnen TO Informatik DO
  246.       GetDskFrage(Fach);
  247.    END;
  248.    TermProcedure(FreeAllFragen);
  249.    (* BreakPoint(ADR("AlleFragen eingelesen")); *)
  250. END Fragen.
  251.